package main

import (
	"fmt"
	"log"
	"net/http"
)

// Engine is the uni handler for all requests
type Engine struct {
}

// 实现ServeHTTP方法后，拦截了所有的http请求，拥有了统一的控制入口
// 在这里一般实现自定义路由以及统一添加一些逻辑处理：如日志，异常处理等
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	log.Println("Request URL Path: ", req.URL.Path)
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from error:", r)
		}
	}()
	switch req.URL.Path {
	case "/":
		indexHandler(w, req)
	case "/hello":
		helloHandler(w, req)
	default:
		w.WriteHeader(http.StatusNotFound)
		w.Write([]byte("404 NOT FOUND: " + req.URL.Path))
	}

}

// http.ListenAndServe(":9999", nil)
/**
第二个参数handler是一个interface接口，需要实现ServeHTTP方法
只要传入任何实现了 ServerHTTP 接口的实例，所有的HTTP请求，就都交给了该实例处理了。
*/

func main() {
	//在此之前，只能通过HandleFunc方法来注册路由和对应的处理函数，
	//这种方式只能针对具体的路由写处理逻辑，比如/hello
	/*http.HandleFunc("/", indexHandler)
	http.HandleFunc("/hello", helloHandler)*/
	//在main方法中，给ListenAndServe第二个方法传入创建的engine实例，
	//那么所有的HTTP请求，就都交给了该实例处理了。
	log.Fatal(http.ListenAndServe(":9999", new(Engine)))
}

func indexHandler(w http.ResponseWriter, req *http.Request) {
	w.WriteHeader(http.StatusOK)
	w.Write([]byte("welcome gee web index!"))
}

func helloHandler(w http.ResponseWriter, req *http.Request) {
	//http.Request.ULR.Query() 返回请求的querystring
	//http.Request.Form 返回请求的form
	for k, v := range req.URL.Query() {
		log.Printf("request key: %s, val: %s\n", k, v)
		// 检查 v 中的每个值是否等于 "法轮功"
		for _, value := range v {
			if value == "法轮功" {
				panic(fmt.Sprintf("非法参数: %s", value))
			}
		}
	}
	w.WriteHeader(http.StatusOK)
	w.Write([]byte("hello gee"))
}
